package com.itheima.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ResourceBundle;

/**
 * Bean 对象 Factory 工厂 Utils 工具类
 *  负责程序中的对象创建
 */
public class BeanFactoryUtils {
    /**
     * 问题:  类过多 if else就太多了->>> 抽
     * 1.在配置文件中声明 key和全限定类名的关系
     * 2.外部传入标识符
     * 3.方法的内部 根据标识符 找到对应的全限定类名
     * 4.实例化对象返回即可
     */
    public static Object getBean(String key){//外部传入的 routeService , categoryService
        Object o = null;
        Object proxy = null;
        try {
            //1.加载配置文件
            ResourceBundle bundle = ResourceBundle.getBundle("bean");
            //2.根据key获得全限定类名
            String className = bundle.getString(key);
            //3.反射实例化对象
            o = Class.forName(className).newInstance();
            Object finalO = o;
            proxy = Proxy.newProxyInstance(BeanFactoryUtils.class.getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    String name = finalO.getClass().getName();//代理对象
                    String  methodName = method.getName(); //执行方法的名称

                    Long time = System.currentTimeMillis();
                    System.out.println( name+"执行方法前:" + methodName + ", 执行时间为:" + time);
                    Object returnData = method.invoke(finalO, args);
                    System.out.println( name+"执行方法后:" + methodName + ", 执行时间为:" + time);
                    return returnData;
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return proxy;
    }
}
